﻿using System;
using System.ComponentModel.DataAnnotations;
using System.Text;
using LAPI.Core;

namespace LAPI.Data.Model
{
    /// <summary>
    /// Modelo de la tabla 'Pista'
    /// </summary>
    public class Pista
    {
        #region Model
        //PK
        [DataType(DataType.Text)]
        [Display(Name = "#")]
        public int idPista { get; set; }
        //FK
        public int idCentroDeportivo { get; set; }
        public String centroDeportivo { get; set; }

        [Required]
        [DataType(DataType.MultilineText)]
        [Display(Name = "Nombre Pista:")]
        [FieldValue("Nombre Pista")]
        public String descripcion { get; set; }

        public Boolean activo { get; set; }

        [Required]
        [DataType(DataType.DateTime)]
        [Display(Name = "Hora apertura:")]
        [FieldValue("Hora apertura")]
        public DateTime tHoraInicio { get; set; }

        [Required]
        [DataType(DataType.DateTime)]
        [Display(Name = "Hora cierre:")]
        [FieldValue("Hora cierre")]
        public DateTime tHoraFinal { get; set; }

        [Required]
        [DataType(DataType.Text)]
        [Display(Name = "Hora apertura:")]
        [FieldValue("Hora apertura")]
        public String horaInicio { get; set; }

        [Required]
        [DataType(DataType.Text)]
        [Display(Name = "Hora cierre:")]
        [FieldValue("Hora cierre")]
        public String horaFinal { get; set; }

        [Required]
        [DataType(DataType.Text)]
        [Display(Name = "Luz artificial disponible:")]
        [FieldValue("Luz artificial disponible")]
        public Boolean luz { get; set; }
        #endregion 

        #region Data Helper
        public const String Table = "PISTA";
        public const String Tables = "PISTA, CENTRODEPORTIVO";
        public const String Columns = "PISTA.ID_PISTA, PISTA.id_centrodeportivo, CENTRODEPORTIVO.descripcion descCentroDeportivo, PISTA.descripcion, hora_ini, hora_fin, luz, PISTA.activo";
        #endregion

        #region Insert Helper

        /// <summary>
        /// Crea la cadena con todas las columnas necesarias en una sentencia insert.
        /// </summary>
        /// <returns>String con la cadena</returns>
        public String ToInsertColumns()
        {
            return "id_centrodeportivo,descripcion,hora_ini,hora_fin,luz,activo";
        }

        /// <summary>
        /// Crea una cadena con todos los valores a insertar en una sentencia insert.
        /// </summary>
        /// <returns>String con la cadena</returns>
        public String ToInsertValues()
        {
            StringBuilder sentence = new StringBuilder();
            sentence.Append("");
            sentence.Append(this.idCentroDeportivo);
            sentence.Append(",'");
            sentence.Append(this.descripcion);
            sentence.Append("','");
            sentence.Append(this.tHoraInicio);
            sentence.Append("','");
            sentence.Append(this.tHoraFinal);
            sentence.Append("',");
            sentence.Append(this.luz ? 1 : 0);
            sentence.Append(",1"); //activo
            return sentence.ToString();
        }
        #endregion

        #region Update Helper 

        /// <summary>
        /// Crea la cadena 'SET x1=y1, x2=y2' de una sentencia update.
        /// <p>Actualiza los siguientes datos del modelo:</p>
        /// <ul>
        /// <li>descripcion</li>
        /// <li>horaInicio</li>
        /// <li>horaFinal</li>
        /// <li>luz</li>
        /// </ul>
        /// </summary>
        /// <returns>String con la cadena</returns>
        public String ToUpdate()
        {
            StringBuilder sentence = new StringBuilder();
            sentence.Append("Descripcion = '");
            sentence.Append(this.descripcion);            
            sentence.Append("',");
            sentence.Append("hora_ini = '");
            sentence.Append(this.tHoraInicio);
            sentence.Append("',");
            sentence.Append("hora_fin = '");
            sentence.Append(this.tHoraFinal);
            sentence.Append("',");
            sentence.Append("luz = ");
            sentence.Append(this.luz ? 1 : 0);
            sentence.Append("");
            return sentence.ToString();
        }

        /// <summary>
        /// Crea la cadena 'SET x1=y1, x2=y2' de una sentencia update.
        /// <p>Actualiza los siguientes datos del modelo:</p>
        /// <ul>
        /// <li>Activo</li>
        /// </ul>
        /// </summary>
        /// <returns>String con la cadena</returns>
        public String ToUpdateEstado()
        {
            StringBuilder sentence = new StringBuilder();
            sentence.Append("Activo = '");
            sentence.Append(this.activo ? 1 : 0);
            sentence.Append("'");

            return sentence.ToString();
        }
        #endregion

        /// <summary>
        /// Método para convertir un Dataset en el modelo.
        /// </summary>
        /// <param name="response">Dataset obtenido en una consulta</param>
        /// <returns>Colección con los modelos obtenidos en la conversión</returns>
        public static System.Collections.Generic.List<LAPI.Data.Model.Pista> toModel(System.Data.DataSet response)
        {
            System.Collections.Generic.List<LAPI.Data.Model.Pista> result = new System.Collections.Generic.List<Data.Model.Pista>();

            foreach (System.Data.DataRow item in response.Tables[0].Rows)
            {
                LAPI.Data.Model.Pista model = new Data.Model.Pista();                
                model.idPista = Convert.ToInt32(item["id_pista"].ToString());
                model.idCentroDeportivo = Convert.ToInt32(item["id_CentroDeportivo"].ToString());
                model.centroDeportivo = item["descCentroDeportivo"].ToString();
                model.descripcion = item["descripcion"].ToString();              
                model.tHoraInicio = Convert.ToDateTime(item["hora_ini"].ToString());
                model.tHoraFinal = Convert.ToDateTime(item["hora_fin"].ToString());
                model.luz = Convert.ToBoolean(item["luz"].ToString());
                model.activo = Convert.ToBoolean(item["activo"].ToString());
                result.Add(model);
            }

            return result;
        }

        /// <summary>
        /// Método para convertir una colección del modelo, en un JSON
        /// </summary>
        /// <param name="models">colección del modelo</param>
        /// <returns>JSON de la colección</returns>
        public static String toJson(System.Collections.Generic.List<LAPI.Data.Model.Pista> models)
        {
            System.Text.StringBuilder sb = new System.Text.StringBuilder();
            System.IO.StringWriter sw = new System.IO.StringWriter(sb);

            using (Newtonsoft.Json.JsonWriter jsonWriter = new Newtonsoft.Json.JsonTextWriter(sw))
            {
                jsonWriter.Formatting = Newtonsoft.Json.Formatting.Indented;
                jsonWriter.WriteStartObject();
                jsonWriter.WritePropertyName("items");
                jsonWriter.WriteStartArray();

                foreach (var item in models)
                {
                    jsonWriter.WriteStartObject();
                    jsonWriter.WritePropertyName("id");
                    jsonWriter.WriteValue(item.idPista);
                    jsonWriter.WritePropertyName("data");
                    jsonWriter.WriteValue(item.descripcion);
                    jsonWriter.WriteEndObject();
                }
                jsonWriter.WriteEndArray();
                jsonWriter.WriteEndObject();
            }

            return sb.ToString();
        }

        public override String ToString()
        {
            return "[Pista]{idCentroDeportivo:" + idCentroDeportivo +
                ",descripcion:" + descripcion +
                ",horaInicio:" + horaInicio +
                ",horaFinal:" + horaFinal +
                ",luz:" + luz +
                "}";
        }
    }
}
